# 实现斐波那契函数(for循环, while循环)
# 拆分需求：1.通过循环实现斐波那契数列 2.通过建立变量和检索的连接实现查询功能

# 自定义异常
class ParamsTypeError(Exception):
    pass

# for循环


def fic_for():                              # 定义斐波那契for循环函数5
    a, b = 0, 1                             # 初始赋值
    fic_for_list = []                       # 定义初始列表
    try:                                    # 如果无报错继续执行代码，如果报错则捕获异常，跳转到except处理异常
        n = int(input('请输入一个正整数：'))    # 取数并将其转化成int类型
        for i in range(n):                  # 执行for循环
            fic_for_list.append(b)          # 将复制后的b以末尾添加的形式增加到定义的列表中
            a, b = b, a + b                 # 运算右侧后，将b赋值给a，将a+b赋值给b
        print(fic_for_list)                 # 根据所输入的数值打印相应位数的斐波那契数列
        print(fic_for_list[n - 1])          # 根据所输入的数值打印相应位数的斐波那契数值
    except:                                          # 报错则执行except
        try:                                                    # 触发报错，并将其抛出
            raise ParamsTypeError("请重新运行程序，并输入正整数")
        except ParamsTypeError as e:
            print(e)


# while循环

def fic_while():
    a = 0                                       # 0赋值给a
    b = 1                                       # 1赋值给b
    num = []                                    # 定义一个num的列表，初始包含0
    try:
        x = int(input('请输入一个正整数'))             # 将输入的字符串转化成int类型的数值，然后赋值给n
        while b >= 1:                               # while循环，条件为b>=1时执行
            num.append(b)                           # 使用增加函数append将b的值添加到num列表中
            a, b = b, a+b                           # 将新的b赋值给a，将a+b的值赋值给b
            if len(num) == x:                       # if函数判断，条件为num列表的长度==n时
                print(num)                          # 打印num列表
                print(num[x-1])                     # 打印列表中我们需要查询的斐波那契数值
                break                               # 条件成立时，输出值，并退出循环
    except:                                                 # 报错则执行except
        try:                                                # 触发报错，并将其抛出
            raise ParamsTypeError("请重新运行程序，并输入正整数")
        except ParamsTypeError as e:
            print(e)


fic_while()
fic_for()